package cn.lic.tool.poi.excel.function;

import org.apache.poi.ss.usermodel.Cell;

import com.alibaba.fastjson.JSONObject;

public interface IFunction extends IFunctionArgument {
	
	public static class Result {
		private Object rs;
		private Result(Object rs) {
			this.rs = rs;
		}
		
		@SuppressWarnings("unchecked")
		public <T> T get() {
			if (this.rs == null) {
				return null;
			}
			return (T)rs;
		}
	}
	
	public static Result createResult(Object rs) {
		return new Result(rs);
	}
	
//	default Value getObject(Object[] args, int index, JSONObject ctx, Object defVal) {
//		Value arg = getArg(args, index, ctx);
//		if (arg == null) {
//			return defVal;
//		}
//		return arg;
//	}
	
//	default String getString(Object[] args, int index, JSONObject ctx, String defVal) {
//		Object arg = getArg(args, index, ctx);
//		if (arg == null) {
//			return defVal;
//		}
//		return TypeUtils.castToString(arg);
//	}
//	
//	default int getInt(Object[] args, int index, JSONObject ctx, int defVal) {
//		Object arg = getArg(args, index, ctx);
//		if (arg == null) {
//			return defVal;
//		}
//		return TypeUtils.castToInt(arg);
//	}
//	
//	default BigDecimal getBigDecimal(Object[] args, int index, JSONObject ctx, BigDecimal defVal) {
//		Object arg = getArg(args, index, ctx);
//		if (arg == null) {
//			return defVal;
//		}
//		return TypeUtils.castToBigDecimal(arg);
//	}
	
//	default JSONArray getJSONArray(Object[] args, int index, JSONObject ctx, JSONArray arr) {
//		Object arg = getArg(args, index, ctx);
//		if (arg == null) {
//			arg = arr;
//		}
//		if (arg == null) {
//			return null;
//		}
//		return JSONArray.parseArray(JSON.toJSONString(arg));
//	}
	
	public IFunction build(IFunctionArgument[] args);
	
	default IValue  execute(JSONObject ctx) {
		throw new FunctionException("模板函数不支持计算：" + this.getClass().getName().toUpperCase());
	}
	
	/**
	 * 
	 * @param cell
	 * @return 如果函数渲染会影响sheet的cell数量，则需要返回函数的渲染范围，否则可以返回null
	 */
	default Range  execute(JSONObject ctx, Cell cell) {
		throw new FunctionException("模板函数不支持单元格渲染：" + this.getClass().getName());
	}
}
